home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / select / select.007 < prev    next >
Text File  |  1995-02-15  |  5KB  |  236 lines

  1. /*
  2.   r.m=80 tab=4
  3.     =======================================================================
  4.    ==  <<バッチ分岐支援プログラム>>                                       ==
  5.    ==      [ select.exe ]      Ver 0.07                                   ==
  6.    ==                                     1995      Program : Y.Gotoh     ==
  7.     =======================================================================
  8. */
  9.  
  10. /*外部ファイル読み込み */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <conio.h>
  16. #include <ctype.h>
  17. #include "gotoh.h"
  18.  
  19. /* グローバル変数の設定 */
  20.  
  21. char *sel[20];        /* select群で使用 */
  22. int end_echo=1;        /* エンディングエコーの表示非表示。初期(1)は表示 */
  23. char *help={
  24.         "\n"
  25.         "             \"select.exe\"  Ver 0.07      1995 : Y.Gotoh (Gori)\n"
  26.         "\n"
  27.         "  select.exe [option] title sel_1 sel_b sel_c ・・・\n"
  28.         "       /h -h ・・・ Help             ヘルプを表示します.\n"
  29.         "       /e -e ・・・ not Eending echo 終了時メッセージを表示しません.\n"
  30.         "\n"
  31.         "  ==メニューの使い方==\n"
  32.         "      [↑],[F],[f]   ・・・・・・・・・・  カーソルを上へ移動\n"
  33.         "      [↓],[J],[j]   ・・・・・・・・・・       〃   下  〃  \n"
  34.         "     [ret],[space]   ・・・・・・・・・・  決定\n"
  35.         "         [0~9]      ・・・・・・・・・・  その番号のメニューを実行\n"
  36.         "     [esc],[Q],[q]   ・・・・・・・・・・  終了\n\n"
  37.         };
  38.  
  39.  
  40. /* 関数の定義 */
  41.  
  42. void waitkey( int wait_time);
  43. void HELP( void );
  44.  
  45. int select(int sel_max);
  46. void select_list(int sel_max);
  47. void select_prt(int sel_no,int sel_bak);
  48.  
  49. /* メイン */
  50.  
  51. int main(int argc , char *argv[])
  52. {
  53.     int ret,sel_max=-1,i,j;            /* sel_maxは後の所で修正されるため初期値 */
  54.                                                             /* は(-1)とする */
  55.     
  56.     txt_cls();
  57.     txt_csl(0);
  58.     locate(20,1);
  59.         txt_color(3);
  60.         printf(    "------------------------------------------\n");
  61.     locate(20,2);
  62.         printf(    " [select,exe]     1995 program : Y.Gotoh \n");
  63.     locate(20,3);
  64.         printf(    "------------------------------------------\n");
  65.     txt_color(7);
  66.     
  67.     /* パラメータの読み込み */
  68.     
  69.     if(argc<2)    HELP();                        /* パラメータ無しはヘルプ表示 */
  70.     
  71.     for(i=1;i<argc;i++)
  72.     {
  73.         if(*(argv[i])=='/' || *(argv[i])=='-')
  74.         {
  75.             switch(*(argv[i]+1))
  76.             {
  77.                 case 'e':
  78.                     end_echo=0;
  79.                 break;
  80.                 
  81.                 case 'h':
  82.                     HELP();
  83.                 break;
  84.             }
  85.         }
  86.         else
  87.         {
  88.             sel_max++;
  89.             sel[sel_max]=argv[i];
  90.         }
  91.     }
  92.     
  93.     if(sel_max<2)
  94.     {
  95.         txt_color(1);
  96.         printf("\n選択肢の数が足りません!!\n");
  97.         txt_color(7);
  98.         HELP();
  99.     }
  100.     
  101.     for(i=0;i<=sel_max;i++)
  102.     {
  103.         printf("%s\n",sel[i]);
  104.     
  105.         for(j=0;j<strlen(sel[i]);j++)                    /* アンダーバーをス */
  106.         {                                                /* ペースに変換する。 */
  107.             if( *(sel[i]+j)=='_' )
  108.             {
  109.                 *(sel[i]+j)=' ';
  110.             }
  111.         }
  112.     }
  113.     
  114.     ret=select(sel_max);                                /* 選択ルーチンへ */
  115.     if(ret==-1)    ret=0;                    /* エスケープ終了は通常終了にする */
  116.     
  117.     txt_cls();
  118.     if(end_echo)                    /* end_echo が 0 以外ならメッセージ表示 */
  119.     {
  120.         printf(    "[select.exe] Ver 0.07  program : Y.Gotoh\n"
  121.                 "    returned error level [%d]\n",ret);
  122.     }
  123.     txt_cslon();
  124.     exit(ret);
  125. }
  126.  
  127. /* select : 項目選択用サブ ,*sel[] をグローバルで用意すること */
  128. int select(int sel_max)
  129. {
  130.     int sel_no=1,sel_bak=1,ret=0;
  131.     char key='\0';                            /* とりあえずループさせるために */
  132.     
  133.     locate(20,5);
  134.         printf("%s\n",sel[0]);                        /* メニュータイトル表示 */
  135.     
  136.     select_list(sel_max);                                        /* 一覧表示 */
  137.     select_prt(sel_no,sel_bak);            /* 初期位置(1)にカーソルを持ってくる */
  138.     
  139.     do
  140.     {
  141.         key=getch();
  142.         key=tolower(key);
  143.         
  144.         /* [↑,F,f]の時 */
  145.         if(key=='\x1e' || key=='\x66')
  146.         {
  147.             sel_bak=sel_no;
  148.             sel_no--;
  149.             if(sel_no<1) sel_no=sel_max;
  150.             select_prt(sel_no,sel_bak);
  151.         }
  152.         
  153.         /* [↓,J,j]の時 */
  154.         if(key == '\x1f' || key=='\x6a')
  155.         {
  156.             sel_bak=sel_no;
  157.             sel_no++;
  158.             if(sel_no>sel_max) sel_no=1;
  159.             select_prt(sel_no,sel_bak);
  160.         }
  161.         
  162.         /* 各数字(0~9)が押された時 */
  163.         if(key >= '\x30' && key <= '\x39')
  164.         {
  165.             sel_bak=sel_no;
  166.             sel_no=(int)key-0x30;
  167.             if(sel_no==0) sel_no=10;
  168.             if(sel_no>sel_max)
  169.             {
  170.                 sel_no=sel_bak;
  171.             }
  172.             else
  173.             {
  174.                 select_prt(sel_no,sel_bak);
  175.                 waitkey(20);
  176.                 key='\x0d';
  177.             }
  178.         }
  179.     }while(key != '\x0d' && key != '\x1b' && key != '\x20' && key != '\x71');
  180.     
  181.     if(key == '\x0d' || key == '\x20' )    ret=sel_no;    /* [space],[ret]なら
  182.                                                             選択番号を返す */
  183.     if(key == '\x71')    ret=0;                    /* [Q],[q]なら終了(ret=0) */
  184.     if(key == '\x1b')    ret=-1;                        /* [esc]なら-1を返す */
  185.     
  186.     return(ret);
  187. }
  188.  
  189. /* 選択肢一覧表示 */
  190. void select_list(int sel_max)
  191. {
  192.     int i;
  193.     
  194.     for(i=1;i<=sel_max;i++)
  195.     {
  196.         locate(19,i+6);
  197.         if(i<10)    printf("%1d: %s",i,sel[i]);
  198.             else    printf("%d: %s",i-10,sel[i]);    /* 10は、0と表示する */
  199.     }
  200. }
  201.  
  202. /* 選択カーソル表示ルーチン */
  203. void select_prt(int sel_no,int sel_bak)
  204. {
  205.     locate(19,sel_bak+6);                        /* 黄色の帯を消す */
  206.     if(sel_bak<10){
  207.         printf("%1d: %s",sel_bak,sel[sel_bak]);
  208.     }
  209.     else    printf("%1d: %s",sel_bak-10,sel[sel_bak]);    /* 10は0に */
  210.     
  211.     locate(19,sel_no+6);                            /* 新しく帯を引く */
  212.     if(sel_no<10){
  213.         printf("\x1b[7;33m%1d: %s\x1b[0;37m",sel_no,sel[sel_no]);
  214.     }
  215.     else    printf("\x1b[7;33m%1d: %s\x1b[0;37m",sel_no-10,sel[sel_no]);
  216. }
  217.  
  218. /* サブルーチン */
  219.  
  220. /* 何かキーを押すか一定時間経つと処理を復帰するサブ */
  221. void waitkey(int wait_time)
  222. {
  223.     int i=0;
  224.     
  225.     for(i=0;i<wait_time*10;i++)
  226.     {
  227.         if( kbhit() != 0)    break;
  228.     }
  229. }
  230.  
  231. void HELP(void)
  232. {
  233.     printf("%s",help);
  234.     exit(0);
  235. }
  236.